package com.suep.system.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    //自定义密钥
    private static final String SECRET_KEY = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";


    //需要重写的方法
    public static String generateToken(Long userId,String username,String role) {
        long expirationTime = 1000 * 60 * 480; //6个小时
        // 创建一个包含额外声明的 Map
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);
        claims.put("username", username);
        claims.put("role", role);

        // 生成 JWT
        return Jwts.builder()
                .setClaims(claims)
                .setSubject("user_info")
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expirationTime)) // 30分钟后过期
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static boolean validateToken(String token) {

        //在离过期时间还剩不到10分钟的时候需要进行过期时间刷新，不可能在用户活跃阶段的时候也退出
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
            //过期时间
            Date expiration = claims.getExpiration();
            // 判断是否过期
            //返回过期时间是在现在时间之后
            return expiration.after(new Date());
        } catch (Exception e) {
            return false;
        }
    }


    public static Map<String, String> getUsernameAndRoleAndUserIdFromToken(String token) {
        // 解析 JWT
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();

        // 提取用户名和角色信息
        String username = (String) claims.get("username");
        String role = (String) claims.get("role");
        //
        String  userId=claims.get("userId").toString();
        // 将信息存入 Map 并返回
        Map<String, String> tokenInfo = new HashMap<>();
        tokenInfo.put("username", username);
        tokenInfo.put("role", role);
        tokenInfo.put("userId", userId);
        System.out.println("==========================================================="+userId);
        System.out.println(role);
        return tokenInfo;
    }


}
